from os.path import basename, dirname, realpath

import bpy
from bpy.props import (CollectionProperty,
                       IntProperty,
                       FloatProperty,
                       BoolProperty,
                       )
from bpy.types import AddonPreferences

from .log import log
from .render_item import RenderItem
from . import QueueUtils


class OverLoadRenderProperty:
    """渲染文件时覆盖渲染参数
    将当前文件覆盖到渲染文件
    """
    use_resolution_percentage: BoolProperty(name='使用手动设置分辨率百分比')
    use_scene_resolution: BoolProperty(name='使用场景分辨率')
    use_compositors_node: BoolProperty(name='使用合成器',
                                       description='''如果场景添加了合成的话将会使用\nCAREFUL 这可能会导致渲染图片无法输出到指定的位置''', )
    use_samples: BoolProperty(name='采样')
    use_engine: BoolProperty(name='引擎')

    use_threads: BoolProperty(name='使用线程')

    use_parameter: BoolProperty(name='参数')
    use_film: BoolProperty(name='胶片')

    use_color_management: BoolProperty(name='色彩管理')
    use_format: BoolProperty(name='格式')
    use_noise: BoolProperty(name='降噪')
    use_out: BoolProperty(name='输出')

    use_performance: BoolProperty(name='性能')

    # 降噪使用原属性


class RenderQueueAddonPreferences(QueueUtils,
                                  AddonPreferences,
                                  OverLoadRenderProperty,
                                  ):
    bl_idname = basename(dirname(dirname(realpath(__file__))))
    render_items: CollectionProperty(type=RenderItem)
    active_index: IntProperty(name='活动渲染项索引')

    show_detailed_render_info: BoolProperty(name='显示详细渲染信息')

    split_queue_list: FloatProperty(name='队列和详细信息的拆分系数',
                                    max=0.99,
                                    default=0.7,
                                    min=0.2, )

    is_update: BoolProperty()

    def stop_all_render(self) -> None:
        """暂停所有渲染
        需要在退出和进入blender时执行一次
        """
        for item in self.render_in_queue_items:  # 将未渲染的放在渲染队列里面
            item.render_state = 'NOT_RENDER'
        if self.render_in_item:
            self.render_in_item.stop_render()
        import sys
        log.info(f'stop_render {sys.argv}')

    def draw(self, context):
        from ..ui.asset_layout import Queue
        Queue.draw_render_queue(self.layout)


class_tuple = (

    RenderQueueAddonPreferences,
)

register_class, unregister_class = bpy.utils.register_classes_factory(
    class_tuple)


def register():
    register_class()


def unregister():
    QueueUtils.stop_render()
    unregister_class()
